Rails中如何使用Active Storage

ActiveStorage,该组件的功能是将本地的文件传到类似 Amazon’s S3, Google’s Cloud Storage, and Microsoft Azure Cloud等云服务进行存储。

Active Storage可以做到

  • 使用ImageMagick上传并转换图片
  • 预览非图片格式文件,比如PDF,视频
  • 从任意的文件中抽取数据
  • 生成下载文件的链接

Active Storage用法

一、配置Active Storage

1.1、升级Rails到5.2.0
1.2、生成Active Storage的迁移文件
1.3、运行rails db:migrate建立对应的数据表
1.4、在config/storage.yml中声明Active Storage的服务,对于每一个服务你必须提供一个服务名称和一些必要的配置
1.5、通过设置Rails.application.config.active_storage.service告诉Active Storage该使用哪个服务,因为每一个环境所使用的服务是不同的,推荐的做法是在config/environments对于每种环境分别设置服务

值得注意的是每种服务都依赖对应的gem包: 如亚马逊依赖’aws-sdk-s3’、微软云依赖’azure-storage’

到此为止关于active相关的设置已经完成,我们可以先使用本地的服务(local)测试下。

二、简单实用Active Storage

2.1、首先将Active Storage和一个模型的字段关联起来
关联的方式有两种:has_one_attached和has_many_attached,顾名思义第一种关联方式是一行数据只关联一个附件,第二种就是可以有多个附件
2.2. controller层面上,你只需要修改下健壮参数方法
当相关字段是has_one_attached,健壮参数方法不用改变
当相关字段是has_many_attached,健壮参数需要改成如下形式
=> 将 params.require(:product).permit(:name, :avatar, :detail_images)
=> 改为 params.require(:product).permit(:name, :avatar, detail_images: [])
2.3 view层表单部分如果你不用direct_upload特性的话就不用改变什么,正常的表单就行了
2.4 view层展现部分你可以使用image_tag然后url部分使用url_for(product.avatar)(这里avatar是active storage has_one_attached相关联的字段),这样就可以将图片展示出来,如果你的文件不是图片,而是PDF或者图片是,你需要使用image_tag detail_image.preview(resize: “200x200”)这样的方式将图片展示出来。
值得注意的是:当文件不是图片,而是PDF或者视频,你想预览该文件时,你需要下载相关的gem mini_migick,还需要三方的插件,PDF的预览需要mutool、Video的预览需要ffmpeg

到现在为止相关上传的图片应该能展现出来了、下面我聊聊如何

三、如何删除和model关联的文件

1
2
3
4
5
# 这里我们假设avatar字段是active storage相关联的字段
# purge方法是立刻删除相关文件
# purge_later则是调用了active job,将删除操作加入到了队列中
@product.avatar.purge
@product.avatar.purge_later

四、如何使用Active Storage生成下载链接

1
2
# 只需要在页面上加上一个连接按钮即可
= link_to '下载', rails_blob_path(product.avatar, disposition: "attachment")